{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np    ###导入必要的包\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets(\"./\")  ##\n",
    "\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xe309518>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4,idx+1)  ###subplot前面俩参数指定的是一个画板被分割成的行和列，\n",
    "    ###后面一个参数则指的是当前正在绘制的编号！\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape((28,28)))\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来，定义用于训练的网络，首先定义网络的输入。\n",
    "\n",
    "这里我们直接使用上面的数据作为输入，所以定义两个placeholder分别用于图像和lable数据，另外，定义一个float类型的变量用于设置学习率。\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，因为我们这里还没有确定batchsize，所以第一个维度留空。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {},
   "outputs": [],
   "source": [
    "x=tf.placeholder(\"float\",[None,784])  ##变量在定义时要初始化，\n",
    "###但是如果有些变量刚开始我们并不知道它们的值,那就用占位符来占个位置\n",
    "##浮点数来表示这些图的具体值，这个张量的形状是[None，784 ]。（这里的None表示此张量的第一个维度可以是任何长度的。）而placeholder是个占位符，\n",
    "##所以很显然这像是个结构的声明.\n",
    "y=tf.placeholder(\"int64\",[None])\n",
    "learning_rate=tf.placeholder(\"float\")  ##学习率\n",
    "\n",
    "def initialize(shape, stddev=0.1):\n",
    "  return tf.truncated_normal(shape, stddev=0.1)\n",
    "\n",
    "L1_units_count=100   ###神经元数量\n",
    "\n",
    "W_1=tf.Variable(initialize([784,L1_units_count]))  ##权重\n",
    "b_1=tf.Variable(initialize([L1_units_count]))  ##偏置项\n",
    "logit_1=tf.matmul(x,W_1)+b_1  ##神经网络计算公式\n",
    "output_1=tf.nn.relu(logit_1)  ##不知道什么激活函数好就用relu，但relu只能用在中间层\n",
    "\n",
    "L2_units_count=10\n",
    "W_2=tf.Variable(initialize([L1_units_count,L2_units_count]))###权重是一个m*k的矩阵，\n",
    "##m表示上一层神经元数量，k表示该层神经元数量\n",
    "b_2=tf.Variable(initialize([L2_units_count]))\n",
    "logits_2=tf.matmul(output_1,W_2)+b_2\n",
    "\n",
    "logits=logits_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算使用了sparse_softmax_cross_entropy_with_logits, 这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。\n",
    "\n",
    "试试看，增大减小学习率，换个优化器再进行训练会发生什么"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [],
   "source": [
    "cross_entropy_loss=tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits,labels=y))\n",
    "optimizer=tf.train.AdamOptimizer().minimize(cross_entropy_loss)\n",
    "###梯度下降法  交叉熵损失最小\n",
    "###tf.train.GradientDescentOptimizer在对所有步骤中的所有变量使用恒定的学习率   \n",
    "##tf.train.AdamOptimizer  如果采用自适应学习率可能会好点8"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布， 要想看到概率分布，还需要做一下softmax。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)   ###通过Softmax回归，将logistic的预测二分类的概率的问题推广到了n分类的概率的问题\n",
    "correct_pred = tf.equal(tf.argmax(pred, 1), y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))\n",
    "########外面那个求均值是因为交叉熵求出来是对单样本的，对于所有样本，我们需要求一个均值。\n",
    "########这里实际上就做了一个批量梯度下降，而单样本同样适用，单个的均值就是自己。只需要把每次train的batchsize设置一下就好了。\n",
    "###tf. argmax函数选择预测输出值最大概率类别，tf.equal与期望类别比较。tf.reduce_meen计算准确率。 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "trainig_step = 1000\n",
    "\n",
    "saver = tf.train.Saver()\n",
    "##将训练好的模型参数保存起来，以便以后进行验证或测试。tf里面提供模型保存的是tf.train.Saver()模块"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构， 实际需要运行的话，还需要创建一个session，并将数据填入网络中。 计算图：TensorFlow是一个通过计算图的形式来表述计算的编程系统。 基于TensorFlow这个编程系统中的每一个计算都是计算图上的一个节点， 而节点与节点之间的连线则代表计算之间的依赖关系。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.613972, the validation accuracy is 0.8696\n",
      "after 200 training steps, the loss is 0.301699, the validation accuracy is 0.8926\n",
      "after 300 training steps, the loss is 0.267163, the validation accuracy is 0.91\n",
      "after 400 training steps, the loss is 0.439695, the validation accuracy is 0.9188\n",
      "after 500 training steps, the loss is 0.264372, the validation accuracy is 0.9216\n",
      "after 600 training steps, the loss is 0.252021, the validation accuracy is 0.9248\n",
      "after 700 training steps, the loss is 0.370379, the validation accuracy is 0.9284\n",
      "after 800 training steps, the loss is 0.369193, the validation accuracy is 0.9354\n",
      "after 900 training steps, the loss is 0.139425, the validation accuracy is 0.9326\n",
      "the training is finish!\n",
      "the test accuarcy is: 0.942\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    \n",
    "    #定义验证集与测试集\n",
    "    validate_data = {\n",
    "        x: mnist.validation.images,\n",
    "        y: mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x: mnist.test.images, y: mnist.test.labels}\n",
    "\n",
    "    for i in range(trainig_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size)\n",
    "        _, loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate: 0.3\n",
    "            })\n",
    "\n",
    "        #每100次训练打印一次损失值与验证准确率\n",
    "        if i > 0 and i % 100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy, feed_dict=validate_data)\n",
    "            print(\n",
    "                \"after %d training steps, the loss is %g, the validation accuracy is %g\"\n",
    "                % (i, loss, validate_accuracy))\n",
    "            saver.save(sess, './model.ckpt', global_step=i)\n",
    "\n",
    "    print(\"the training is finish!\")\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy, feed_dict=test_data)\n",
    "    print(\"the test accuarcy is:\", acc)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面，用我们训练的模型做一个测试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0xe3552e8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')  ###checkpoint文件会记录保存信息，通过它可以定位最新保存的模型：\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path) ###saver.restore函数给出model.ckpt-n的路径后会自动寻找参数名-值文件进行加载\n",
    "        final_pred, acc = sess.run(    \n",
    "            [pred, accuracy],                       \n",
    "            feed_dict={\n",
    "                x: mnist.test.images[:16],\n",
    "                y: mnist.test.labels[:16]\n",
    "            })\n",
    "        orders = np.argsort(final_pred) ##我们发现argsort()函数是将x中的元素从小到大排列，提取其对应的index(索引)\n",
    "        plt.figure(figsize=(8, 8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx, :][-1]\n",
    "            prob = final_pred[idx, :][order]\n",
    "            plt.subplot(4, 4, idx + 1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],\n",
    "                                                  order, prob * 100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28, 28)))\n",
    "\n",
    "    else:\n",
    "        pass\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [],
   "source": [
    "##如果采用自适应学习率可能会好点"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
